﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Insifo.WE;
using System.Text.RegularExpressions;
using System.Collections.Specialized;
using System.Text;

public partial class segMenuEditar : ObjectPage
{
    #region CONSTANTES

    private const string RUTA_LISTA = "~/seg/segMenuListar.aspx";

    #endregion

    #region EVENTOS

    protected void Page_Load(object sender, EventArgs e)
    {
        //Eventos del Master
        Master.MenuAccionEvento += new MasterPageMenuEditarClickHandler(Master_MenuButton);
        ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "CargarTabs", "javascript:CargarTabs();", true);

        if (!IsPostBack)
        {
            Cargar();
        }
    }

    protected void Master_MenuButton(object sender, EventArgs e)
    {
        string strAccion = ((CommandEventArgs)e).CommandName;
        switch (strAccion)
        {
            case "Aceptar":
                if (tvMenu.SelectedNode == null)
                {
                    Util.ejecutaScriptAJAX(this.Page, string.Format("alert('{0}');", Resources.resMensaje.msgAlertaSeleccioneMenu));
                    return;
                }
                GuardarNodo();
                break;
            case "Cancelar":
                Salir();
                break;
        }
    }

    protected void ibtMenuNodo_Command(object sender, CommandEventArgs e)
    {
        if (tvMenu.SelectedNode == null)
        {
            Util.ejecutaScriptAJAX(this.Page, string.Format("alert('{0}');", Resources.resMensaje.msgAlertaSeleccioneMenu));
            return;
        }
        string strAccion = e.CommandName;
        switch (strAccion)
        {
            case "NuevoNodo":
                NuevoNodo();
                break;
            case "EliminarNodo":
                hfAccionNodo.Value = "d";
                GuardarNodo();
                break;
        }
    }

    private void ListarAcciones(int idMenu)
    {
        DataTable dt = ListarAccion(idMenu);
        lvAccion.DataSource = dt;
        lvAccion.DataBind();
    }

    private void ObtenerAcciones(ref WCMenu.BEMenu pbe)
    {
        var acciones = new List<int>();

        foreach (ListViewDataItem lv in lvAccion.Items)
        {
            HiddenField hfIdAccion = (HiddenField)lv.FindControl("hfIdAccion");
            CheckBox chkSel = (CheckBox)lv.FindControl("chkSel");

            if (chkSel.Checked)
            {
                acciones.Add(int.Parse(hfIdAccion.Value));
            }
        }

        pbe.Acciones = acciones.ToArray();

    }

    protected void lvAccion_ItemDataBound(object sender, ListViewItemEventArgs e)
    {
        if (e.Item.ItemType == ListViewItemType.DataItem)
        {
            HiddenField hfSeleccion = (HiddenField)e.Item.FindControl("hfSeleccion");
            CheckBox chkSel = (CheckBox)e.Item.FindControl("chkSel");
            if (hfSeleccion.Value.Equals("1"))
                chkSel.Checked = true;
        }

    }

    protected void tvMenu_SelectedNodeChanged(object sender, EventArgs e)
    {
        if (!string.IsNullOrEmpty(tvMenu.SelectedValue))
        {
            hfAccionNodo.Value = "e";
            EditarNodo(hfAccionNodo.Value, tvMenu.SelectedNode);
        }
    }

    protected void tvMenu_TreeNodePopulate(object sender, TreeNodeEventArgs e)
    {
        MostrarNodosHijos(e.Node);
    }

    #endregion

    #region METODOS

    protected void Cargar()
    {
        string strAccion = Request.QueryString["a"];   //a: N-Nuevo, e-Editar, v-Ver
        string strId = Request.QueryString["i"];  //Id
        hfidAplicacion.Value = strId;
        //Carga Estado y Tipo de Control
        Util.loadCombo(ddlEstado, ListarParametroDetalle(1, 1, Constantes.PARAMETRO_ESTADOREGISTRO), "Descripcion", "ParametroDetalle");
        Util.loadCombo(ddlTipoControl, ListarParametroDetalle(1, 1, Constantes.PARAMETRO_TIPOCONTROL), "Descripcion", "ParametroDetalle");
        //Configuracion del Formulario
        this.Master.MenuAplicar.Visible = false;
        ibtNuevoNodo.Style["display"] = "none";
        ibtEliminarNodo.Style["display"] = "none";
        //Genera el Nodo Principal
        CrearNodoAplicacion(int.Parse(strId));
        MostrarPanelEnBlanco(true);

        lnkMenu.HRef = string.Format("#{0}", tabMenu.ClientID);
        lnkBoton.HRef = string.Format("#{0}", tabBoton.ClientID);
    }

    protected void LimpiarValores()
    {
        hfIdMenu.Value = string.Empty;
        hfIdNivel.Value = string.Empty;
        hfOrden.Value = string.Empty;
        hfNodoPath.Value = string.Empty;
    }

    /// <summary>
    /// Muestra y Oculta el formulario de registro del Menu
    /// </summary>
    /// <param name="blnSeleccion">Mostrar el Panel en Blanco</param>
    protected void MostrarPanelEnBlanco(bool blnMostrar)
    {
        pnlFormulario.Style["display"] = blnMostrar ? "none" : "block";
        pnlSeleccioneNodo.Style["display"] = blnMostrar ? "block" : "none";
    }

    /// <summary>
    /// Creacion del Nodo del Menu
    /// </summary>
    /// <param name="pstrIdMenu">Id del Menu</param>
    /// <param name="pstrOrden">Orden del Menu</param>
    /// <param name="pintNivel">Nivel del Menu</param>
    /// <param name="pstrDescripcion">Descripcion del Menu</param>
    /// <param name="pstrEstado">Estado del Menu</param>
    /// <param name="pstrTipoControl">Tipo de Control del Menu</param>
    /// <param name="pintCantidad">Cantidad de Menus</param>
    /// <returns></returns>
    private TreeNode CrearNodoMenu(string pstrIdMenu, string pstrOrden, int pintNivel, string pstrDescripcion, string pstrEstado, string pstrTipoControl, int pintCantidad)
    {
        TreeNode tn = new TreeNode();
        if ((pintCantidad) > 0)
            tn.PopulateOnDemand = true;
        tn.Value = string.Format("{0}${1}${2}${3}", pintNivel, pstrOrden, pstrIdMenu, pstrTipoControl);
        tn.Text = ArmaTextoNodo(pstrIdMenu, pstrDescripcion, pstrEstado, pstrTipoControl);
        return tn;
    }

    /// <summary>
    /// Crea el Nodo de Aplicacion del Arbol
    /// </summary>
    /// <param name="pintIdAplicacion"></param>
    protected void CrearNodoAplicacion(int pintIdAplicacion)
    {
        WCAplicacion.BEAplicacion be = ObtenerAplicacion(pintIdAplicacion);
        TreeNode tn = CrearNodoMenu("", "", 0, be.Descripcion, be.Estado, "G", 1);
        tvMenu.Nodes.Add(tn);
    }

    /// <summary>
    /// Resetea los valores para el registro de un Nuevo Menu
    /// </summary>
    protected void NuevoNodo()
    {
        hfAccionNodo.Value = "n";
        tdOrden.Visible = false;
        txtOrden.Visible = false;
        txtOrden.Text = string.Empty;
        txtIdMenu.Text = string.Empty;
        txtIdMenu.Enabled = false;
        txtDescripcion.Text = string.Empty;
        txtObjeto.Text = string.Empty;
        ddlTipoControl.SelectedIndex = 0;
        ddlTipoControl.Enabled = true;
        ddlEstado.SelectedIndex = 0;
        txtUsuarioCreacion.Text = string.Empty;
        txtFechaCreacion.Text = string.Empty;
        txtUsuarioModificacion.Text = string.Empty;
        txtFechaModificacion.Text = string.Empty;
        lblNodo.Text = Resources.resDiccionario.NuevoMenu;
        MostrarPanelEnBlanco(false);
    }

    /// <summary>
    /// Muestra los nodos hijos cuando se presiona el boton + en el treeview
    /// </summary>
    /// <param name="nodo"></param>
    private void MostrarNodosHijos(TreeNode ptn)
    {
        if (ptn != null)
            if (ptn.ChildNodes.Count == 0)
                PoblarArbol(ptn, int.Parse(hfidAplicacion.Value));
    }

    /// <summary>
    /// Poblar los Nodos Hijos del Menu
    /// </summary>
    /// <param name="ptn"></param>
    /// <param name="pintIdAplicacion"></param>
    protected void PoblarArbol(TreeNode ptn, int pintIdAplicacion)
    {
        string[] strValores = ptn.Value.Split('$'); //Nivel|Orden|IdMenu
        DataTable dt = ListarMenuPorNivel(pintIdAplicacion, int.Parse(strValores[0]) + 1, strValores[1]);
        foreach (DataRow dr in dt.Rows)
        {
            ptn.ChildNodes.Add(
                    CrearNodoMenu(
                            dr["IdMenu"].ToString(),
                            dr["Orden"].ToString(),
                            (int)dr["Nivel"],
                            dr["Descripcion"].ToString(),
                            dr["Estado"].ToString(),
                            dr["TipoControl"].ToString(),
                            (int)dr["Cantidad"]
                    )
            );
        }
    }


    /// <summary>
    /// Arma el Texto del Nodo del Menu
    /// </summary>
    /// <param name="pstrIdMenu">Id del Menu</param>
    /// <param name="pstrOrden">Orden del Menu</param>
    /// <param name="pstrDescripcionMenu">Descripcion del Menu</param>
    /// <param name="pstrEstadoMenu">Estado del Menu</param>
    /// <returns></returns>
    private string ArmaTextoNodo(string pstrIdMenu, string pstrDescripcionMenu, string pstrEstadoMenu, string pstrTipo)
    {
        string strCadena = string.Empty, strIcono = string.Empty, strStyle = string.Empty;
        if (pstrTipo == "M")
        {
            if (pstrEstadoMenu == "A")
                strIcono = "../img/ico_cc_ver.gif";
            else
                strIcono = "../img/ico_cc_gri.gif";
            strCadena = string.Format(" <img src='{0}' style='border:0;'/> <span id=\"nodo{1}\" style=\"cursor:pointer;{2}\" onmouseover=\"this.style.textDecoration='underline';\" onmouseout=\"this.style.textDecoration='none';\" >&nbsp;{3}</span>", strIcono, pstrIdMenu, strStyle, pstrDescripcionMenu);
        }
        //if (pstrTipo == "G")
        //{
        else
        {
            if (pstrEstadoMenu == "A")
            {
                strIcono = "../img/ico_cc_az.gif";
            }
            else
            {
                strIcono = "../img/ico_cc_gri.gif";
            }
            strCadena = string.Format(" <img src='{0}' style='border:0;'/> <span id=\"nodo{1}\" style=\"cursor:pointer;{2}\" onmouseover=\"this.style.textDecoration='underline';\" onmouseout=\"this.style.textDecoration='none';\" >&nbsp;{3}</span>", strIcono, pstrIdMenu, strStyle, pstrDescripcionMenu);
        }

        return strCadena;
    }

    protected void EditarNodo(string pstrAccionNodo, TreeNode tnNodo)
    {
        int intIdMenu = 0;
        string[] strValores = tnNodo.Value.Split('$'); //Nivel|Orden|IdMenu|TipoControl
        int.TryParse(strValores[2], out intIdMenu);

        bool blnSeleccion = (intIdMenu > 0);

        if (pstrAccionNodo == "e")
        {
            lblNodo.Text = Resources.resDiccionario.EditarMenu;
            ibtEliminarNodo.Attributes.Add("style", "display:inline");
            ibtNuevoNodo.Attributes.Add("style", "display:inline");
        }

        if (blnSeleccion)
        {
            //Se obtiene el Menu
            WCMenu.BEMenu be = ObtenerMenu(new WCMenu.BEMenu { IdMenu = intIdMenu });

            //Nodo Padre - Valores
            hfIdMenu.Value = intIdMenu.ToString();
            hfIdNivel.Value = strValores[0];
            hfOrden.Value = strValores[1];
            hfNodoPath.Value = tnNodo.ValuePath;

            //Datos del Menu
            txtIdMenu.Text = hfIdMenu.Value;
            txtIdMenu.Enabled = false;
            txtDescripcion.Text = be.Descripcion;
            Util.SelectCombo(ddlTipoControl, be.TipoControl);
            txtObjeto.Text = be.Objeto;
            ddlTipoControl.Enabled = (be.CantidadMenu <= 0);
            txtOrden.Text = be.Orden;
            tdOrden.Visible = true;
            txtOrden.Visible = true;

            //Datos de Auditoria
            Util.SelectCombo(ddlEstado, be.Estado);
            txtUsuarioCreacion.Text = be.UsuarioCreacion;
            txtFechaCreacion.Text = be.FechaCreacion.ToString(AppSettings.FormatoFechaHora);
            txtUsuarioModificacion.Text = be.UsuarioModificacion;
            txtFechaModificacion.Text = be.FechaModificacion.ToString(AppSettings.FormatoFechaHora);
        }
        else
        {
            //Nodo de la Aplicacion
            hfIdMenu.Value = intIdMenu.ToString();
            hfIdNivel.Value = strValores[0];
            hfOrden.Value = strValores[1];
            hfNodoPath.Value = tnNodo.ValuePath;
            ibtEliminarNodo.Attributes.Add("style", "display:none");
        }

        if (ibtNuevoNodo.Style["display"] == "inline")
            ibtNuevoNodo.Style["display"] = strValores[3] == "G" ? "inline" : "none";

        tabBoton.Style["display"] = strValores[3] == "M" ? "inline" : "none";
        liBoton.Style["display"] = strValores[3] == "M" ? "inline" : "none";

        MostrarPanelEnBlanco(!blnSeleccion);
  
        ListarAcciones(intIdMenu);
    }

    protected bool ValidarNodo(ref WCMenu.BEMenu pbe)
    {

        string strOrden = hfOrden.Value;
        if (!string.IsNullOrEmpty(txtOrden.Text))
            strOrden = txtOrden.Text;
        WCMenu.BEMenu be = new WCMenu.BEMenu
        {
            //Valores del Menu
            IdMenu = int.Parse(hfIdMenu.Value),
            Descripcion = txtDescripcion.Text.Trim(),
            IdAplicacion = int.Parse(hfidAplicacion.Value),
            TipoControl = ddlTipoControl.SelectedValue,
            Orden = strOrden,
            Objeto = txtObjeto.Text.Trim(),
            Nivel = int.Parse(hfIdNivel.Value),

            //Auditoria
            Estado = ddlEstado.SelectedValue,
            UsuarioCreacion = UsuarioSistema.CodigoUsuario,
            FechaCreacion = DateTime.Now,
            UsuarioModificacion = UsuarioSistema.CodigoUsuario,
            FechaModificacion = DateTime.Now
        };
        pbe = be;
        return true;
    }

    protected void GuardarNodo() //G:Grabar
    {
        string strAccionNodo = string.Empty,
               strUsuario = string.Empty,
               strIdioma = string.Empty,
               pstrPath = string.Empty;

        strAccionNodo = hfAccionNodo.Value; //a: n-Nuevo, e-Editar
        strUsuario = UsuarioSistema.CodigoUsuario;
        strIdioma = UsuarioSistema.CodigoIdioma;

        WCMenu.BEMenu be = new WCMenu.BEMenu();
        TreeNode tnNodoActual = tvMenu.SelectedNode;

        if (!ValidarNodo(ref be)) //Valida e Inicializa
            return;

        //Grabar
        switch (strAccionNodo)
        {
            case "n": //Nuevo
                be = InsertarMenu(be);
                ObtenerAcciones(ref be);
                be = RegistrarAcciones(be);
                if (be.Error != 0)
                {
                    if (be.Error == -1)
                        Util.ejecutaScriptAJAX(this.Page, string.Format("alert('{0}');", Resources.resMensaje.msgErrorRegistrarMenu));
                    return;
                }
                //Actualiza Nodo - Nuevo
                be = ObtenerMenu(be);

                //TreeNode tnNuevoNodo = new TreeNode();
                TreeNode tnNuevoNodo = CrearNodoMenu(be.IdMenu.ToString(), be.Orden, be.Nivel, be.Descripcion, be.Estado, be.TipoControl, 0);
                //tnNuevoNodo.Value = string.Format("{0}${1}${2}${3}", be.Nivel.ToString(), be.Orden.ToString(), be.IdMenu.ToString(),be.TipoControl.ToString());
                if (tvMenu.Nodes.Count < 1)
                {
                    //Si es nuevo nodo
                    pstrPath = tnNuevoNodo.Value;
                    // tnNuevoNodo.Text = ArmaTextoNodo(be.IdMenu.ToString(),be.Descripcion, be.Estado,be.TipoControl);
                    tvMenu.Nodes.Add(tnNuevoNodo);
                }
                else
                {
                    //Si existe mas de un nodo
                    pstrPath = tnNodoActual.ValuePath + tvMenu.PathSeparator + tnNuevoNodo.Value.ToString();
                    // tnNuevoNodo.Text = ArmaTextoNodo(be.IdMenu.ToString(),be.Descripcion, be.Estado,be.TipoControl);
                    tnNodoActual.ChildNodes.Add(tnNuevoNodo);
                    tnNodoActual.Expand();
                }

                hfAccionNodo.Value = "e"; //edita
                tvMenu.SelectedNode.Selected = false;
                tvMenu.FindNode(pstrPath).Selected = true;
                EditarNodo(hfAccionNodo.Value, tvMenu.SelectedNode);
                break;

            case "e": //Actualiza
                be = ActualizarMenu(be);
                ObtenerAcciones(ref be);
                be = RegistrarAcciones(be);
                if (be.Error != 0)
                {
                    Util.ejecutaScriptAJAX(this.Page, string.Format("alert('{0}');", Resources.resMensaje.msgErrorActualizarMenu));
                    return;
                }

                be = ObtenerMenu(be);
                tnNodoActual.Text = ArmaTextoNodo(be.IdMenu.ToString(), be.Descripcion, be.Estado, be.TipoControl);
                EditarNodo(hfAccionNodo.Value, tvMenu.SelectedNode);
                break;

            case "d": //Elimina
                be.Estado = Constantes.ESTADO_INACTIVO;
                be = EliminaMenu(be);
                ObtenerAcciones(ref be);
                be = RegistrarAcciones(be);
                if (be.Error != 0)
                {
                    if (be.Error == -1)
                        Util.ejecutaScriptAJAX(this.Page, string.Format("alert('{0}');", Resources.resMensaje.msgErrorEliminarMenu));
                    return;
                }
                //Borra el Nodo

                if (tnNodoActual != null)
                {
                    TreeNode tnNodoPadre = tnNodoActual.Parent;
                    if (tnNodoPadre == null)
                        tvMenu.Nodes.RemoveAt(0);
                    else
                    {
                        tnNodoPadre.ChildNodes.Remove(tnNodoActual);
                    }
                }
                LimpiarValores();
                MostrarPanelEnBlanco(true);
                break;
        }
    }

    protected void Salir()
    {
        string strCadena = string.Format("?a=l&param1={0}", Request.QueryString["param1"]);
        Util.Redireciona(RUTA_LISTA, strCadena, true);
    }

    protected WCMenu.BEMenu RegistrarAcciones(WCMenu.BEMenu pbe)
    {
        EliminarAcciones(pbe);
        pbe = InsertarAcciones(pbe);
        if (pbe.Error != 0)
        {
            Util.ejecutaScriptAJAX(this.Page, string.Format("alert('{0}');", Resources.resMensaje.msgErrorActualizarAccciones));
            return pbe;
        }

        return pbe;
    }

    #endregion

    #region LLAMDAS A WEBSERVICES

    protected DataTable ListarAccion(int idMenu)
    {
        WCMenu.BEMenu be = new WCMenu.BEMenu();
        be.IdMenu = idMenu;
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCMenu.IWCMenu>("BasicHttpBinding_IWCMenu"))
        {
            var response = client.ServiceOperation<DataTable>(
               c => c.ListarAcciones(be).Tables[0]
               );
            ;
            dt = response;
        }
        return dt;
    }

    protected void EliminarAcciones(WCMenu.BEMenu pbe)
    {
        using (var client = new ServiceClient<WCMenu.IWCMenu>("BasicHttpBinding_IWCMenu"))
        {
            client.ServiceOperation(c => c.EliminarAcciones(pbe));
        }
    }

    protected WCMenu.BEMenu InsertarAcciones(WCMenu.BEMenu pbe)
    {
        WCMenu.BEMenu be = new WCMenu.BEMenu();
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCMenu.IWCMenu>("BasicHttpBinding_IWCMenu"))
        {
            var response = client.ServiceOperation<WCMenu.BEMenu>(
               c => c.InsertarAcciones(pbe)
               );
            ;
            be = response;
        }
        return be;
    }

    /// <summary>
    /// Método Lista Niveles de Alerta
    /// </summary>
    /// <returns>Devuelve un DataSet</returns>
    protected WCMenu.BEMenu InsertarMenu(WCMenu.BEMenu pbe)
    {
        WCMenu.BEMenu be = new WCMenu.BEMenu();
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCMenu.IWCMenu>("BasicHttpBinding_IWCMenu"))
        {
            var response = client.ServiceOperation<WCMenu.BEMenu>(
               c => c.Insertar(pbe)
               );
            ;
            be = response;
        }
        return be;
    }

    /// <summary>
    /// Método Obtiene Nivel de Alerta
    /// </summary>
    /// <returns>Devuelve un Objeto</returns>
    protected WCMenu.BEMenu ObtenerMenu(WCMenu.BEMenu pbe)
    {
        WCMenu.BEMenu be = new WCMenu.BEMenu();
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCMenu.IWCMenu>("BasicHttpBinding_IWCMenu"))
        {
            var response = client.ServiceOperation<WCMenu.BEMenu>(
               c => c.Obtener(pbe)
               );
            ;
            be = response;
        }
        return be;
    }

    /// <summary>
    /// Método Actualiza un Nivele de Alerta
    /// </summary>
    /// <returns>Devuelve un DataSet</returns>
    protected WCMenu.BEMenu ActualizarMenu(WCMenu.BEMenu pbe)
    {
        WCMenu.BEMenu be = new WCMenu.BEMenu();
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCMenu.IWCMenu>("BasicHttpBinding_IWCMenu"))
        {
            var response = client.ServiceOperation<WCMenu.BEMenu>(
               c => c.Actualizar(pbe)
               );
            ;
            be = response;
        }
        return be;
    }

    /// <summary>
    /// Método Elimina un Nivele de Alerta
    /// </summary>
    /// <returns>Devuelve un DataSet</returns>
    protected WCMenu.BEMenu EliminaMenu(WCMenu.BEMenu pbe)
    {
        WCMenu.BEMenu be = new WCMenu.BEMenu();
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCMenu.IWCMenu>("BasicHttpBinding_IWCMenu"))
        {
            var response = client.ServiceOperation<WCMenu.BEMenu>(
               c => c.Eliminar(pbe)
               );
            ;
            be = response;
        }
        return be;
    }

    /// <summary>
    /// Método Lista Menus
    /// </summary>
    /// <returns>Devuelve un dataTable</returns>
    protected DataTable ListarMenu()
    {
        WCMenu.BEMenu be = new WCMenu.BEMenu();
        be.IdAplicacion = 0;
        be.Descripcion = "";
        be.Estado = "A";
        be.Pagina = 0;
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCMenu.IWCMenu>("BasicHttpBinding_IWCMenu"))
        {
            var response = client.ServiceOperation<DataTable>(
               c => c.Listar(be).Tables[0]
               );
            ;
            dt = response;
        }
        return dt;
    }

    /// <summary>
    /// Método Lista Companias
    /// </summary>
    /// <returns>Devuelve un dataTable</returns>
    protected DataTable ListarParametroDetalle(int pintidCompania, int pintIdAplicacion, string pstrParametro)
    {
        WCParametroDetalle.BEParametroDetalle be = new WCParametroDetalle.BEParametroDetalle();
        be.IdCompania = pintidCompania;
        be.IdAplicacion = pintIdAplicacion;
        be.Parametro = pstrParametro;
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCParametroDetalle.IWCParametroDetalle>("BasicHttpBinding_IWCParametroDetalle"))
        {
            var response = client.ServiceOperation<DataTable>(c => c.Listar(be).Tables[0]);
            dt = response;
        }
        return dt;
    }

    /// <summary>
    /// Método Lista Menus por Nivel
    /// </summary>
    /// <returns>Devuelve un dataTable</returns>
    protected DataTable ListarMenuPorNivel(int pintIdAplicacion, int pintNivel, string pstrOrden)
    {
        WCMenu.BEMenu be = new WCMenu.BEMenu();
        be.IdAplicacion = pintIdAplicacion;
        be.Nivel = pintNivel;
        be.Orden = pstrOrden;
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCMenu.IWCMenu>("BasicHttpBinding_IWCMenu"))
        {
            var response = client.ServiceOperation<DataTable>(
               c => c.ListarPorNivel(be).Tables[0]
               );
            ;
            dt = response;
        }
        return dt;
    }

    /// <summary>
    /// Método Obtiene la Aplicacion
    /// </summary>
    /// <returns>Devuelve un Objeto</returns>
    protected WCAplicacion.BEAplicacion ObtenerAplicacion(int pintIdAplicacion)
    {
        WCAplicacion.BEAplicacion be = new WCAplicacion.BEAplicacion();
        be.IdAplicacion = pintIdAplicacion;
        DataTable dt = new DataTable();
        using (var client = new ServiceClient<WCAplicacion.IWCAplicacion>("BasicHttpBinding_IWCAplicacion"))
        {
            var response = client.ServiceOperation<WCAplicacion.BEAplicacion>(
               c => c.Obtener(be)
               );
            ;
            be = response;
        }
        return be;
    }

    #endregion

}